package com.hfb.mashibing.alip8.juc.c020;


import java.util.concurrent.locks.LockSupport;
import java.util.concurrent.locks.ReentrantLock;

/**
 * reentrantLock 用于代替 synchronized
 * 由于m锁定this ，只有m执行完毕的时候，n才能执行
 * 这里是复习 synchronized 最原始的语义
 *
 * reentrantLock 可以完成同样的功能，更灵活
 * 需要注意的是，必须要手动释放锁
 * 使用 synchronized 锁定的话，如遇异常jvm 会自动释放锁，
 * 但是lock必须手动释放，因此经常放在finally里
 *
 * 使用 reentrantLock 可以进行"尝试锁定"tryLock，
 * 这样(在规定时间内)无法锁定，代码都将继续执行
 *
 * 使用 ReentrantLock 还可以调用 lockInterruptibly 方法，
 * 可以对线程 Interruptibly ，在一个线程等等锁的过程中可以被打断。
 *
 * reentrantLock 还可以指定为公平锁
 */

public class T05_ReentrantLock5 extends Thread {

    private static ReentrantLock lock = new ReentrantLock(true);// 公平锁
//    private static ReentrantLock lock = new ReentrantLock();// 非公平锁，默认

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName() + "获得锁");
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        T05_ReentrantLock5 rl = new T05_ReentrantLock5();
        Thread t1 = new Thread(rl);
        Thread t2 = new Thread(rl);
        t1.start();
        t2.start();

    }
}
